package com.lzkjiot.service.gnss.transger.core.server;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.timeout.IdleStateHandler;
import io.netty.handler.timeout.ReadTimeoutHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.nio.ByteOrder;
import java.util.concurrent.TimeUnit;

@Component
public class GnssChannelInitializer extends ChannelInitializer<SocketChannel> {

    @Autowired
    private GnssBusiHandler gnssBusiHandler; // 注入 Spring Bean

    /*
     *    包头        设备id    数据类型    数据长度      工况数据长度      数据      crc（校验和）
     *   2 字节        4字节     2字节       2字节         2字节                   2字节
     *  0x22 0x33     端口号     后8位                    后八位
     */
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        // 日志打印
//        pipeline.addLast(new LoggingHandler(LogLevel.INFO));
        // LengthFieldBasedFrameDecoder 用于解决TCP黏包半包问题
        pipeline.addLast(new LengthFieldBasedFrameDecoder(
                ByteOrder.LITTLE_ENDIAN,
                2 * 1024,    // maxFrameLength       消息最大长度
                8,  // lengthFieldOffset    指的是长度域的偏移量，表示跳过指定个数字节之后的才是长度域
                2,  // lengthFieldLength    记录该帧数据长度的字段，也就是长度域本身的长度
                2,  // lengthAdjustment     长度的一个修正值，可正可负,
                0,  // initialBytesToStrip  从数据帧中跳过的字节数
                true
        ));
        // 自定义协议解码器
        pipeline.addLast(new DataFrameDecoder());
        // 自定义协议编码器
//        pipeline.addLast(new DataFrameEncoder());
        // 设备认证
//        pipeline.addLast(deviceAuthHandler);
        // 心跳处理
//        pipeline.addLast(new HeartBeatResponseHandler());
        // 业务处理handler
        pipeline.addLast(gnssBusiHandler);
    }
}
